<?php


namespace CbjCode\General\Library\DesignVue\src\components\form;

use Exception;

/**
 * Class FormSchema
 * @property $field 字段名
 * @property $label 字段标题
 * @property $subLabel 二级标签名灰色
 * @property $suffix 组件后面的内容
 * @property $changeEvent 表单更新事件名称
 * @property $helpMessage 标签名右侧温馨提示
 * @property $helpComponentProps 标签名右侧温馨提示组件  [
            'maxWidth'=>'',//最大长度
            'showIndex'=>false,//是否显示序号
            'text'=>'',//文本列表
            'color'=>'',// 颜色
            'fontSize'=>'',// 字体大小
            'icon'=>'',// 图标
            'absolute'=>false,// 定位方式
            'position'=>'',// 定位
        ]
 * @property $component 组件类型
 * @property $componentProps 所渲染的组件的 props  ()=>{}
 * @property $rules 校验规则 ValidationRule[]
 * @property $required 是否必填, 默认否
 * @property $rulesMessageJoinLabel  校验信息是否加入 label false
 * @property $itemProps 参考ant-design-vue下方 FormItem
 * @property $colProps 参考上方 例如 { span: 8 }
 * @property $defaultValue 所渲渲染组件的初始值
 * @property $origins
 * @property $search
 */
class FormSchema
{
    public static $instance;

    protected $origins = [
        'field'=>'','label'=>'','subLabel'=>null,'suffix'=>null,'changeEvent'=>null,'helpMessage'=>null,
        'helpComponentProps'=>null,'component'=>'','componentProps'=>null,'rules'=>null,'required'=>false,
        'rulesMessageJoinLabel'=>false,'itemProps'=>null,'colProps'=>null,'defaultValue'=>null,'search'=>[]
    ];

    /**
     * FormSchema constructor.
     * @param string $field
     * @param string $label
     * @param string $component
     * @param bool $required
     * @throws Exception
     */
    public function __construct($field = '',string $label = '', string $component = '', bool $required = false)
    {
        if (is_array($field)){
            $this->setAttrs($field);
        }else{
            $this->origins['field'] = $field;
            $this->origins['label'] = $label;
            $this->origins['component'] = $component;
            $this->origins['required'] = $required;
        }
    }

    /**
     * @param string|array $field 字段名称
     * @param string $label 字段标题
     * @param string $component 字段组件类型
     * @param bool $required 是否必填
     * @return FormSchema
     */
    public static function make($field = '',string $label = '', string $component = '', bool $required = false){
        $self = self::$instance;
        if (!$self instanceof self) {
            $self = new static($field,$label,$component,$required);
        }
        return $self->origins;
    }

    /**
     * 设置提示信息
     * @param array $rules 规则信息
     * @return FormSchema
     * @throws Exception
     */
    public function setRules(array $rules = []){
        $this->setAttr('rules',$rules);
        return $this->origins;
    }

    /**
     * 设置组件扩展属性
     * @param array $props 扩展属性
     * @return FormSchema
     * @throws Exception
     */
    public function setComponentProps(array $props = []){
        $this->setAttr('componentProps',$props);
        return $this->origins;
    }

    /**
     * @param array $attrs
     * @throws Exception
     */
    protected function setAttrs(array $attrs = []) {
        $allowAttrs = array_keys($this->origins);
        foreach ($attrs as $field=>$value){
            if (in_array($field,$allowAttrs)){
                $this->origins[$field] = $value;
            }else{
                throw new Exception("attr {$field} 不是此Input的属性!");
            }
        }
    }

    /**
     * @param string $key
     * @param null $value
     * @throws Exception
     */
    protected function setAttr($key = '',$value = null) {
        $allowAttrs = array_keys($this->origins);
        if (in_array($key,$allowAttrs)){
            $this->origins[$key] = $value;
        }else{
            throw new Exception("attr {$key} 不是此Input的属性!");
        }
    }

    /**
     * 防止实例被克隆
     */
    public function __clone()
    {
        // TODO: Implement __clone() method.
    }

    /**
     * 防止反序列化（这将创建它的副本）
     */
    public function __wakeup()
    {
        // TODO: Implement __wakeup() method.
    }

}